-- 夜鸭手游自动化辅助脚本（懒人精灵UI事件版）
-- 作者: AI助手
-- 版本: 1.0

local NIGHT_CROWS_PACKAGE = "com.wemade.nightcrowsglobal"
local NIGHT_CROWS_PLUGIN_PACKAGE = "com.nightCrows.game"
local KITSUNEBI_PACKAGE = "fun.kitsunebi.kitsunebi4android"
local TURING = require("TURING")

local config = require('Config/config')
require('Config/TextRecognition1')
local Tools = require('Tools')
local text_recognition_lib = require('Config.TextRecognition1').文字识别库
------------------------->>> 开头调用! <<<-------------------------[...]
--TURING = require("TURING")
-- 需要把“UTF8.lib”字库文件添加到“资源”中，并释放"TURING.rc"使用！
extractAssets("mybot.rc", getSdPath(), "夜鸭字库.lib")

function logmsg(msg)
    print("[夜鸭助手] " .. msg)
    toast(msg)
end

function check_kitsunebi_installed()
    -- 获取已安装app列表
    local apps = getInstalledApps()
    for i, v in ipairs(apps) do
        --print("已安装包:", v.pkg, v.app)
        if v.pkg == KITSUNEBI_PACKAGE then
            logmsg("Kitsunebi app已安装")
            return true
        end
    end
    logmsg("Kitsunebi app未安装，请先安装Kitsunebi")
    return false
end

function launch_kitsunebi()
    if not check_kitsunebi_installed() then
        return false
    end
    logmsg("正在启动Kitsunebi app...")
    runApp(KITSUNEBI_PACKAGE)
    sleep(3000)
    check_click_kitsunebi_playBtn()
    logmsg("Kitsunebi app已启动")
    sleep(1000)
    return true
end

function check_click_kitsunebi_playBtn() --点击kitsunebi的play按钮
    return Tools.turing_recognize_and_act(610,1075,647,1116, "000000-303030", 2, 8, text_recognition_lib, "Kitsunebi启动按钮", function()
        tap(625,1093) --点击连接代理按钮
    end)
end

function close_kitsunebi()
    logmsg("正在关闭Kitsunebi app...")
    stopApp(KITSUNEBI_PACKAGE)
    sleep(1000)
    logmsg("Kitsunebi app已关闭")
end

function restart_kitsunebi()
    logmsg("正在重启Kitsunebi app...")
    close_kitsunebi()
    sleep(2000)
    return launch_kitsunebi()
end

function check_kitsunebi_status()
    logmsg("Kitsunebi app状态检查:")
    local installed = check_kitsunebi_installed()
    logmsg("- 已安装: " .. (installed and "是" or "否"))
    if installed then
        logmsg("- 尝试启动Kitsunebi...")
        local success = launch_kitsunebi()
        logmsg("- 启动结果: " .. (success and "成功" or "失败"))
    end
    toast("Kitsunebi检查完成")
end

function check_night_crows_installed()
    -- 获取已安装app列表
    local apps = getInstalledApps()
    for i, v in ipairs(apps) do
        --print("已安装包:", v.pkg, v.app)
        if v.pkg == NIGHT_CROWS_PACKAGE then
            logmsg("夜鸭app已安装")
            return true
        end
    end
    logmsg("夜鸭app未安装，请先安装游戏")
    return false
end

function check_night_crows_plugin_installed()
    -- 获取已安装app列表
    local apps = getInstalledApps()
    for i, v in ipairs(apps) do
        --print("已安装包:", v.pkg, v.app)
        if v.pkg == NIGHT_CROWS_PLUGIN_PACKAGE then
            logmsg("夜鸭插件app已安装")
            return true
        end
    end
    logmsg("夜鸭插件app未安装，请先安装插件")
    return false
end

function launch_night_crows()
    if not check_night_crows_installed() then
        return false
    end
    logmsg("正在启动夜鸭app...")
    runApp(NIGHT_CROWS_PACKAGE)
    sleep(3000)
    logmsg("夜鸭app已启动")
    return true
end

function launch_night_crows_plugin()
    if not check_night_crows_plugin_installed() then
        return false
    end
    logmsg("正在启动夜鸭插件app...")
    runApp(NIGHT_CROWS_PLUGIN_PACKAGE)
    sleep(3000)
    logmsg("夜鸭插件app已启动")
    return true
end

function close_night_crows()
    logmsg("正在关闭夜鸭app...")
    stopApp(NIGHT_CROWS_PACKAGE)
    sleep(1000)
    logmsg("夜鸭app已关闭")
end

function close_night_crows_plugin()
    logmsg("正在关闭夜鸭插件app...")
    stopApp(NIGHT_CROWS_PLUGIN_PACKAGE)
    sleep(1000)
    logmsg("夜鸭插件app已关闭")
end

function restart_night_crows()
    logmsg("正在重启夜鸭app...")
    close_night_crows()
    sleep(2000)
    return launch_night_crows()
end

function check_app_status()
    logmsg("夜鸭app状态检查:")
    local installed = check_night_crows_installed()
    logmsg("- 已安装: " .. (installed and "是" or "否"))
    if installed then
        logmsg("- 尝试启动夜鸭app...")
        local success = launch_night_crows()
        logmsg("- 启动结果: " .. (success and "成功" or "失败"))
    end
    toast("夜鸭app检查完成")
end

function check_kitsunebi_app_status()
    local is_running = isAppRunning(KITSUNEBI_PACKAGE)
    local installed = check_kitsunebi_installed()
    logmsg("Kitsunebi app状态检查:")
    logmsg("- 已安装: " .. (installed and "是" or "否"))
    logmsg("- 正在运行: " .. (is_running and "是" or "否"))
    toast("已安装: " .. (installed and "是" or "否") .. "\n正在运行: " .. (is_running and "是" or "否"))
end


  function check_isLogin() --检测如果是登录界面，则点击
    print("检查是否登录界面")  
    return Tools.turing_recognize_and_act(588,502,688,523, "0-134", 2, 5, text_recognition_lib, "请点击画面", function()
        tap(635,512)
        sleep(3000)
    end)
  end

  function check_is_account_login()
    print("检查是否是账号类型选择界面")
    return Tools.turing_recognize_and_act(332,301,386,352, "0-181", 2, 5, text_recognition_lib, "账号类型-谷歌按钮", function()
        tap(600,324)
        print("点击谷歌账号类型")
        sleep(3000)
    end)
  end

function auto_click_google_account()
    print("检查是否是谷歌账号选择界面")
    local result = Tools.turing_recognize_and_act(604,248,767,303, "0-214", 2, 5, text_recognition_lib, "具体谷歌账号选择界面", function()
        tap(656,469)
        print("点击具体谷歌账号")
        sleep(3000)
        
        -- 循环检测界面是否还在，直到消失或超时
        local start_time = os.time()
        local timeout_seconds = 60
        local max_attempts = timeout_seconds * 2  -- 每0.5秒检测一次
        local attempts = 0
        
        print("开始循环检测谷歌账号选择界面是否消失...")
        while attempts < max_attempts do
            attempts = attempts + 1
            local current_time = os.time()
            
            -- 检查是否超时
            if current_time - start_time >= timeout_seconds then
                print("检测超时60秒，网络可能有问题")
                toast("网络连接异常，请检查网络状态")
                return false
            end
            
            -- 检测界面是否还在
            local still_exists = Tools.turing_recognize_and_act(604,248,767,303, "0-214", 2, 5, text_recognition_lib, "具体谷歌账号选择界面", function()
                return true  -- 如果检测到界面还在，返回true
            end)
            
            if not still_exists then
                print("谷歌账号选择界面已消失，检测完成")
                return true
            end
            
            print("界面仍在，继续等待... (第" .. attempts .. "次检测)")
            sleep(500)  -- 等待0.5秒后再次检测
        end
        
        print("检测超时60秒，网络可能有问题")
        toast("网络连接异常，请检查网络状态")
        return false
    end)
    
    return result
end

function check_isRoleSelect()
    print("检查是否是选择角色界面")
    return Tools.turing_recognize_and_act(1141,670,1192,697, "0-129", 5, 5, text_recognition_lib, "角色选择界面-开始按钮", function()
        tap(1169,682)
        print("点击角色选择界面-开始按钮")
        sleep(3000)
    end)
end

function check_isEnterGame()
    print("识别是否是世界地图")
    CheckAndClickFangDaJing() --如果在主城中需要先关掉放大镜在检测

    return Tools.turing_recognize_and_act(19,71,38,89, "0-91", 5, 5, text_recognition_lib, "游戏主界面-PVP模式按钮", function()
        return true
    end)
end

-- 关闭活动弹窗的方法（可扩展更多弹窗处理）
function close_activity_popup()
    print("检测是否是活动弹窗界面")
    return Tools.turing_recognize_and_act(1122,580,1160,613, "0-114", 5, 5, text_recognition_lib, "活动弹窗关闭按钮", function()
        tap(1118,573)
        print("点击关闭活动弹窗")
        sleep(2000)
        tap(1118,573)
        return true
    end)
end

-- 检测并处理错误弹窗（如服务器错误/断开等）
function detect_and_handle_error_popup()
    print("检测是否是错误界面")
    return Tools.turing_recognize_and_act(616,438,663,463, "0-131", 5, 5, text_recognition_lib, "更新界面确认按钮", function()
        tap(639,456)
        print("点击服务器链接失败确认按钮")
        sleep(3000)
    end)
end

function check_is_UpdatePanel()
    print("检查是否是更新界面")
    return Tools.turing_recognize_and_act(706,447,755,473, "0-141", 1, 4, text_recognition_lib, "更新界面确认按钮", function()
        tap(729,463)
        print("点击更新界面确认按钮")
        sleep(3000)
        return true
    end)
end

function check_is_WeiHuPanel()
    print("检查是否是未维护界面")
  
end

function check_isFastLogin()
    print("检查是否是快速登录界面")
    local index = -1
    local x = -1
    local y = -1
    index,x,y=Tools.find_and_tap(589,351,694,380,"快速登录界面.png","000000",0,0.9)
    print(index,x,y)
    if x ~= 0  and y ~= 0 then
        tap(x, y)
        print("点击快速登录")
        sleep(3000)
    end
    sleep(100)
end

function OpenCurrentMap(mapName)  
    print("检查是否是主城")
    CheckAndClickFangDaJing()  --关闭打开的放大镜 
    sleep(1000)
    tap(125,78)--点击左上角的地图中心，打开大地图
    print("打开大地图")           
end

function OpenWorldMap(mapName)
    print("识别是否是世界地图")
    CheckAndClickFangDaJing()
    Tools.turing_recognize_and_act(609,663,663,692, "0-119", 2, 5, text_recognition_lib, "世界地图按钮-屏幕正下方", function()
        print("打开世界地图")
        tap(635,667)
    end)
end

function CheckIsMap(mapName)
    ------------------------->>> 标准方案! <<<-------------------------[...]
    return Tools.turing_recognize_and_act(1037,73,1162,98, "A7C9D9-404040", 2, 5, text_recognition_lib, mapName, function()
        print("mapName:"..mapName)
        return true
    end)
end

function CheckIsExitMap() --判断是否是退出地图界面 
  	------------------------->>> 标准方案! <<<-------------------------[...]
	return Tools.turing_recognize_and_act(1226,18,1254,52, "0-103", 2, 5, text_recognition_lib, "退出地图按钮", function()
        return true
    end)
end

function CheckIsExitNPCPanel(needTap) --判断是否是NPC界面 
    sleep(1000)
  
    ------------------------->>> 标准方案! <<<-------------------------[...] 
  isNPCPanel = Tools.turing_recognize_and_act(1235,26,1248,44, "0-84", 1, 4, text_recognition_lib, "NPC界面退出按钮", function()
      if needTap == true then
         tap(1241,35)   --点击退出NPC界面按钮
      end   
  end)
  return isNPCPanel
end

function CheckIsAutoFight() --判断是否是自动战斗界面
      	------------------------->>> 标准方案! <<<-------------------------[...]
	local result1 = Tools.turing_recognize_and_act(1210,438,1259,486, "0-153", 8, 5, text_recognition_lib, "自动战斗按钮-未开始", function()
        return true
    end)
    if result1 then return true end
    
    local result2 = Tools.turing_recognize_and_act(1210,438,1259,486, "0-153", 8, 5, text_recognition_lib, "自动战斗按钮-未开始2", function()
        return true
    end)
    return result2
end

function CheckIsHang() --判断是否是正在挂机
    return true
end

function OpenTargetMap(mapName)--打开目标地图--需要位于世界地图中
    --首先判断是否在目标地图
    print("检查是否在"..mapName.."地图")
    if CheckIsMap(mapName) == true then
        print("已经在"..mapName.."地图")
        return  
    end
    OpenWorldMap(mapName)
    -- 由于识别对象是动态变化的，添加循环确保至少尝试10次
    local maxAttempts = 10
    local currentAttempt = 0
    
    while currentAttempt < maxAttempts do
        currentAttempt = currentAttempt + 1
        print("第" .. currentAttempt .. "次尝试识别世界地图位置...")
        
        --由于世界地图打开之后，地图上面的地图名字UI会有两种不同的位置，所以识图需要做两套来对应不同的位置
        --1. 第一种位置 
        local result1 = Tools.turing_recognize_and_act(749,246,797,263, "010101-404040|464849-101010", 5, 5, text_recognition_lib, "世界地图-卡代尔位置2", function()
            if mapName == config.MapName.阿维利乌斯 then    
                tap(640,326)
                print("点击阿维利乌斯地图")               
            elseif mapName == config.MapName.基尔德巴特 then
                tap(506,122)
                print("点击基尔德巴特地图")
                sleep(1000)
            elseif mapName == config.MapName.卡代尔 then
                tap(786,168)
                print("点击卡代尔地图")
            elseif mapName == config.MapName.切拉诺 then
                tap(834,235)
                print("点击切拉诺地图")
            elseif mapName == config.MapName.奥贝尔火山地带 then
                tap(583,189)
                print("点击奥贝尔火山地带地图")
            elseif mapName == config.MapName.巴斯提姆 then
                tap(753,296)
                print("点击巴斯提姆地图")
                sleep(1000)
            elseif mapName == config.MapName.特罗内特尔 then
                tap(684,158)
                print("点击特罗内特尔地图")
                sleep(1000)
            end
            return true
        end)
        if result1 then 
            print("第" .. currentAttempt .. "次尝试成功识别位置1")
            return true 
        end

        --2. 第二种位置.这个位置下卡代尔的文字框范围是：690,404,484,424
        local result2 = Tools.turing_recognize_and_act(715,405,761,420, "010101-404040|464849-101010", 5, 5, text_recognition_lib, "世界地图-卡代尔位置1", function()
            --说明当前位于世界地图中，直接点击目标地图
            sleep(1000)
            if mapName == config.MapName.阿维利乌斯 then    
                tap(586,539)
                print("点击阿维利乌斯地图")               
            elseif mapName == config.MapName.基尔德巴特 then
                tap(443,278)
                print("点击基尔德巴特地图")
                sleep(1000)
            elseif mapName == config.MapName.卡代尔 then
                tap(750,332)
                print("点击卡代尔地图")
            elseif mapName == config.MapName.切拉诺 then
                tap(798,428)
                print("点击切拉诺地图")
            elseif mapName == config.MapName.奥贝尔火山地带 then
                tap(527,368)
                print("点击奥贝尔火山地带地图")
            elseif mapName == config.MapName.巴斯提姆 then
                tap(708,497)
                print("点击巴斯提姆地图")
                sleep(1000)
            elseif mapName == config.MapName.特罗内特尔 then
                tap(641,320)
                print("点击特罗内特尔地图")
                sleep(1000)
            end
            return true
        end)   
        if result2 then 
            print("第" .. currentAttempt .. "次尝试成功识别位置2")
            return true 
        end

        --3. 第三种位置.这个位置下卡代尔的文字框范围是：690,404,484,424
        local result3 = Tools.turing_recognize_and_act(749,246,797,263, "0-122", 5, 5, text_recognition_lib, "世界地图-卡代尔位置3", function()
            if mapName == config.MapName.阿维利乌斯 then    
                tap(630,321)
                print("点击阿维利乌斯地图")               
            elseif mapName == config.MapName.基尔德巴特 then
                tap(508,120)
                print("点击基尔德巴特地图")
                sleep(1000)
            elseif mapName == config.MapName.卡代尔 then
                tap(786,163)
                print("点击卡代尔地图")
            elseif mapName == config.MapName.切拉诺 then
                tap(833,235)
                print("点击切拉诺地图")
            elseif mapName == config.MapName.奥贝尔火山地带 then
                tap(583,185)
                print("点击奥贝尔火山地带地图")
            elseif mapName == config.MapName.巴斯提姆 then
                tap(751,299)
                print("点击巴斯提姆地图")
                sleep(1000)
            elseif mapName == config.MapName.特罗内特尔 then
                tap(684,149)
                print("点击特罗内特尔地图")
                sleep(1000)
            end
            return true
        end)
        
        if result3 then 
            print("第" .. currentAttempt .. "次尝试成功识别位置3")
            return true 
        end
        
        -- 如果当前尝试失败，等待一段时间后继续下一次尝试
        if currentAttempt < maxAttempts then
            print("第" .. currentAttempt .. "次尝试失败，等待1秒后重试...")
            sleep(1000)
        end
    end
    
    -- 所有尝试都失败
    print("经过" .. maxAttempts .. "次尝试，未能识别到任何世界地图位置，打开目标地图失败")
    return false
end 

function OpenBastim()--打开巴斯提姆地图
    local index = -1
    local x = -1
    local y = -1
    index,x,y=Tools.find_and_tap(534,7,568,35,"世界地图钻石图标.png","000000",0,0.9)
    print(index,x,y)
    if index ~= -1 then
        tap(x,y)
        print("点击巴斯提姆地图")
        sleep(1000)
    end
end

function OpenQlno() --打开切拉诺地图
    local index = -1
    local x = -1
    local y = -1
    index,x,y=Tools.find_and_tap(534,7,568,35,"世界地图钻石图标.png","000000",0,0.9)
    print(index,x,y)
    if index ~= -1 then
        tap(x,y)
        print("点击切拉诺地图")
        sleep(1000)
    end
end

function OpenObeiHuoshan() --打开奥贝尔火山地带地图
    local index = -1
    local x = -1
    local y = -1
    index,x,y=Tools.find_and_tap(534,7,568,35,"世界地图钻石图标.png","000000",0,0.9)
    print(index,x,y)
    if index ~= -1 then
        tap(x,y)
        print("点击奥贝尔火山地带地图")
        sleep(1000)
    end
end

function CheckIsKADAIER() --判断是否是卡代尔
    ------------------------->>> 标准方案! <<<-------------------------[...]
    return Tools.turing_recognize_and_act(1037,73,1162,98, "A7C9D9-404040", 2, 5, text_recognition_lib, "卡代尔", function()
        print("卡代尔")
        return true
    end)
end

function OpenKadel()--打开卡代尔地图
    --首先判断是否在卡代尔地图
    print("检查是否在卡代尔地图")
    if CheckIsKADAIER() == true then
        print("已经在卡代尔地图")
        return  
    end
    --这里之所以用钻石图标来识图，是因为其他图片背景都会动态变化，无法识别
    local index, x, y = -1, -1, -1
    index,x,y=Tools.find_and_tap(534,7,568,35,"世界地图钻石图标.png","000000",0,0.9)
    print(index,x,y)
    if index ~= -1 then
        tap(638,321)
        print("点击卡代尔地图")
        sleep(1000)
    end    
    if CheckIsKADAIER() == true then
        print("已进入卡代尔地图")
        return true
    else
        print("未进入卡代尔地图")
        return false
    end
end

function OpenTelonetel() --打开特罗内特尔地图
  if   CheckIsMap(config.MapName.特罗内特尔) == true then
    print("已经在特罗内特尔地图")
    return
  else
    print("不在特罗内特尔地图")
    return
  end
end

function OpenJiedebate() --打开基尔德巴特地图

end

function CheckIsConfirmChuansong()
    -- 检查是否出现确认传送按钮
    TURING.来源_获取屏幕像素(710,456,752,477)    -- 需要修改的地方！
	-- TURING.来源_获取屏幕像素(0,0,100,100)    -- 仅备用！
	TURING.滤镜_彩色_二值化("0-133")
	TURING.切割_范围投影切割(1,4)
	--TURING.字库_加载识别字库(getSdPath() .. "/夜鸭字库.lib")    -- 识别字库路径可自行更换！！！
	TURING.字库_加载六十四进制识别字库(require('Config.TextRecognition1').文字识别库())     -- [VIP]
	local 识别结果 = TURING.识别(85)   
    print('识别结果:'..识别结果)
	if 识别结果 ~= nil and 识别结果 ~= "" then    -- 注意：空值判断
        if 识别结果 == "确认传送按钮" then
            return true            
        end
	end  
    return false
end

function FindFightPosByName(fightPOsName)
    --要调用此方法，需要位于地区信息界面
    local 最大滑动次数 = 10
    local 当前滑动次数 = 0
    
    -- 在开始查找前，先向下滑动4次，每次450像素，确保从顶部开始查找
    print("开始查找前，先向下滑动4次重置到顶部")
    for i = 1, 4 do
        print("向下滑动第", i, "次")
        -- 从坐标(1089, 372)向下滑动450像素，让画面往上翻
        swipe(1089, 372, 1089, 372 + 450, 500)
        sleep(1000)
    end
    print("向下滑动完成，开始查找:", fightPOsName)
    
    while 当前滑动次数 < 最大滑动次数 do
        print("第", 当前滑动次数 + 1, "次查找:", fightPOsName)
        
        ------------------------->>> 标准方案! <<<-------------------------[...]
        TURING.来源_获取屏幕像素(917,181,1258,707)    -- 需要修改的地方！
        -- TURING.来源_获取屏幕像素(0,0,100,100)    -- 仅备用！
        TURING.滤镜_彩色_二值化("0-105")
        TURING.切割_范围投影切割(2,5)
        --TURING.字库_加载识别字库(getSdPath() .. "/夜鸭字库.lib")    -- 识别字库路径可自行更换！！！
        TURING.字库_加载六十四进制识别字库(require('Config.TextRecognition1').文字识别库_野外挂机())     -- [VIP]
        local 识别结果 = TURING.识别(85,2)   
        print('识别结果:', 识别结果)
        local 绝对值数据 = TURING.OCR_AbsCoords(识别结果)   
        print('绝对值数据:', 绝对值数据)
        sleep(1000)
        if 识别结果 ~= nil and 识别结果 ~= "" then    -- 注意：空值判断
            -- 使用绝对值数据获取准确坐标
            if 绝对值数据 and type(绝对值数据) == "table" then
                -- 收集所有识别到的位置名称
                local recognized_positions = {}
                for i, 数据 in pairs(绝对值数据) do
                    if type(数据) == "table" and 数据[1] then
                        table.insert(recognized_positions, 数据[1])
                    end
                end
                
                -- 使用模糊匹配查找目标位置
                local is_match, matched_name = Tools.fuzzy_match(fightPOsName, recognized_positions)
                
                if is_match then
                    -- 找到匹配的位置，获取其坐标
                    for i, 数据 in pairs(绝对值数据) do
                        if type(数据) == "table" and 数据[1] == matched_name then
                            local x = 数据[2]
                            local y = 数据[3]
                            print("找到目标位置:", fightPOsName, "匹配到:", matched_name, "绝对坐标:", x, y)
                            tap(x, y)
                            sleep(1000)
                            tap(x + 200, y)--点击目标坐标右边200像素的传送按钮
                            print("点击传送按钮")
                            sleep(1000)
                            if CheckIsConfirmChuansong() == true then
                                tap(710,456)
                                print("点击确认传送按钮")
                                sleep(1000)
                            end
                            return true
                        end
                    end
                end
                print("未找到目标位置:", fightPOsName, "执行向上滑动")
                -- 从坐标(1089, 372)向上滑动450像素，让画面往下翻
                swipe(1089, 372, 1089, 372 - 450, 500)
                sleep(1000)
                当前滑动次数 = 当前滑动次数 + 1
            else
                print("绝对值数据格式错误，执行向上滑动")
                -- 从坐标(1089, 372)向上滑动450像素，让画面往下翻
                swipe(1089, 372, 1089, 372 - 450, 500)
                sleep(1000)
                当前滑动次数 = 当前滑动次数 + 1
            end
        else
            print("识别结果为空，执行向上滑动")
            -- 从坐标(1089, 372)向上滑动450像素，让画面往下翻
            swipe(1089, 372, 1089, 372 - 450, 500)
            sleep(1000)
            当前滑动次数 = 当前滑动次数 + 1
        end
    end
    
    print("已滑动", 最大滑动次数, "次，仍未找到目标位置:", fightPOsName)
    return false
end

function UseRandomChuansong()--使用随机传送卷轴
    local 最大尝试次数 = 10
    local 当前尝试次数 = 0
    
    while 当前尝试次数 < 最大尝试次数 do
        当前尝试次数 = 当前尝试次数 + 1
        print("第", 当前尝试次数, "次尝试使用随机传送卷轴")
        
        ------------------------->>> 标准方案! <<<-------------------------[...]
        TURING.来源_获取屏幕像素(794,638,836,671)    -- 需要修改的地方！
        -- TURING.来源_获取屏幕像素(0,0,100,100)    -- 仅备用！
        TURING.滤镜_彩色_二值化("0-68")
        TURING.切割_范围投影切割(1,4)
        --TURING.字库_加载识别字库(getSdPath() .. "/夜鸭字库.lib")    -- 识别字库路径可自行更换！！！
        TURING.字库_加载六十四进制识别字库(require('Config.TextRecognition1').文字识别库())     -- [VIP]
        local 识别结果 = TURING.识别(85,2)   
        print('识别结果:', 识别结果)
        local 绝对值数据 = TURING.OCR_AbsCoords(识别结果)   
        print('绝对值数据:', 绝对值数据)
        
        if 识别结果 ~= nil and 识别结果 ~= "" then    -- 注意：空值判断
            if 绝对值数据 and type(绝对值数据) == "table" then
                -- 收集所有识别到的文本
                local recognized_texts = {}
                for i, 数据 in pairs(绝对值数据) do
                    if type(数据) == "table" and 数据[1] then
                        table.insert(recognized_texts, 数据[1])
                    end
                end
                
                -- 使用模糊匹配查找随机卷轴
                local is_match, matched_text = Tools.fuzzy_match("快捷栏里面的随机卷轴", recognized_texts)
                
                if is_match then
                    -- 找到匹配的文本，获取其坐标
                    for i, 数据 in pairs(绝对值数据) do
                        if type(数据) == "table" and 数据[1] == matched_text then
                            local x = 数据[2]
                            local y = 数据[3]
                            tap(x, y)
                            print("点击快捷栏里面的随机传送卷轴，匹配到:", matched_text, "绝对坐标:", x, y)
                            sleep(1000)
                            print("随机传送卷轴使用成功")
                            return true
                        end
                    end
                else
                    print("未找到快捷栏里面的随机传送卷轴")
                end
            else
                print("绝对值数据格式错误")
            end
        else
            print("识别结果为空")
        end
        
        -- 如果当前尝试失败，等待一段时间后重试
        if 当前尝试次数 < 最大尝试次数 then
            print("等待2秒后重试...")
            sleep(2000)
        end
    end
    
    print("随机传送卷轴使用失败，已达到最大尝试次数:", 最大尝试次数)
    return false
end

function StartAutoFight()
    print("开始自动战斗流程")
    local 最大尝试次数 = 10
    local 当前尝试次数 = 0
    
    while 当前尝试次数 < 最大尝试次数 do
        当前尝试次数 = 当前尝试次数 + 1
        print("第", 当前尝试次数, "次尝试启动自动战斗")
        
        -- 检查是否已经在自动战斗状态
        if CheckIsAutoFight() == true then
            print("检测到自动战斗按钮，点击启动")
            tap(1234,462)
            sleep(2000) -- 等待2秒让自动战斗启动
            print("自动战斗启动成功")
            return true
        else
            print("未检测到自动战斗按钮，尝试使用随机传送卷轴")
            local 传送成功 = UseRandomChuansong()
            if 传送成功 then
                print("随机传送成功，等待3秒后重新检测")
                sleep(3000)
            else
                print("随机传送失败，等待2秒后重试")
                sleep(2000)
            end
        end
        
        -- 如果达到最大尝试次数，退出循环
        if 当前尝试次数 >= 最大尝试次数 then
            print("已达到最大尝试次数", 最大尝试次数, "次，自动战斗启动失败")
            return false
        end
    end
    
    return false
end
 function CheckAndClickExitMap()
    if CheckIsExitMap() == true then --如果退出地图界面，则点击退出按钮
        tap(1239,35)
        print("退出地图成功")
    else
        print("不用退出地图")
    end
 end

function CheckNeedRevive() --检查是否需要复活
    --点击复活按钮 
    return Tools.turing_recognize_and_act(1144,665,1188,689, "0-91", 8, 8, text_recognition_lib, "复活按钮", function()
        tap(1174,675)
        print("复活按钮")
        return true
    end)
end

function CheckIsNPC()--检测NPC界面是否打开了
    print("检测NPC界面是否打开了")
    
    -- 使用更短的字符串，只匹配关键的NPC按钮名称
    local npc_keywords = {"杂货", "武器", "仓库", "技能", "手工艺品", "炼金术", "工会"}
    
    -- 直接使用TURING进行识别，然后使用模糊匹配
    TURING.来源_获取屏幕像素(10,67,277,386)
    TURING.滤镜_彩色_二值化("0-105")
    TURING.切割_范围投影切割(1,4)
    TURING.字库_加载六十四进制识别字库(text_recognition_lib())
    local 识别结果 = TURING.识别(60)
    sleep(300)
    print('NPC界面识别结果:', 识别结果)
    
    if 识别结果 and 识别结果 ~= "" then
        -- 将识别结果按逗号分割成数组
        local recognized_items = {}
        for item in string.gmatch(识别结果, "[^,]+") do
            table.insert(recognized_items, item:match("^%s*(.-)%s*$")) -- 去除首尾空格
        end
        
        -- 使用模糊匹配检查是否包含NPC关键词
        for i, keyword in ipairs(npc_keywords) do
            local is_match, matched_item = Tools.fuzzy_match(keyword, recognized_items)
            if is_match then
                print("检测到NPC界面，匹配到关键词:", keyword, "->", matched_item)
                return true
            end
        end
    end
    
    print("未检测到NPC界面")
    return false
end

function CheckAndClickNPC(npcName, callback) --检查是否需要买药，支持回调函数
      --点击买药按钮
      TURING.来源_获取屏幕像素(10,67,277,386)    -- 需要修改的地方！
      -- TURING.来源_获取屏幕像素(0,0,100,100)    -- 仅备用！
      TURING.滤镜_彩色_二值化("0-105")
      TURING.切割_范围投影切割(1,4)
      --TURING.字库_加载识别字库(getSdPath() .. "/夜鸭字库.lib")    -- 识别字库路径可自行更换！！！
      TURING.字库_加载六十四进制识别字库(require('Config.TextRecognition1').文字识别库())     -- [VIP]
      local 识别结果 = TURING.识别(85,2)
      sleep(300)
     
      local 绝对值数据 = TURING.OCR_AbsCoords(识别结果)    
      print('绝对值数据:', 绝对值数据)
     
      if 识别结果 ~= nil and 识别结果 ~= "" then    -- 注意：空值判断
          if 绝对值数据 and type(绝对值数据) == "table" then
              for i, 数据 in pairs(绝对值数据) do
                print("数据:", 数据)
                print("数据[1]:", 数据[1])
                if 数据[1] == "主城" then
                    tap(304,72) --点击放大镜以显示NPC界面
                  sleep(1000)
                end
                  if type(数据) == "table" and 数据[1] == npcName or 数据[1] == "主城" then     
                      local x = 数据[2]
                      local y = 数据[3]
                      tap(x, y+3)
                      print("点击NPC按钮:", npcName, "绝对坐标:", x, y+3)      
                      local isExitNPCPanel = false
                      while isExitNPCPanel == false do  --循环判断是否到达了杂货铺
                        isExitNPCPanel = CheckIsExitNPCPanel(false)
                        print("isExitNPCPanel:", isExitNPCPanel)
                        print("循环判断是否到达了杂货铺")       
                        sleep(100)
                      end
                      --(10000) --因为这里一般要跑路过去，所以给个8秒延迟
                      
                      -- 执行回调函数（如果提供）
                      if callback and type(callback) == "function" then
                          print("执行NPC点击后的回调函数")
                          callback()
                      end
                      
                      return true
                  end
              end
              print("未找到NPC按钮:", npcName)
              return false
          else
              print("绝对值数据格式错误")
              return false
          end
      end
      return false    
end

function CheckAndClickOneKeyBuy()
    TURING.来源_获取屏幕像素(235,659,415,704)    -- 需要修改的地方！
    -- TURING.来源_获取屏幕像素(0,0,100,100)    -- 仅备用！
    TURING.滤镜_彩色_二值化("0-138")
    TURING.切割_范围投影切割(2,4)
    --TURING.字库_加载识别字库(getSdPath() .. "/夜鸭字库.lib")    -- 识别字库路径可自行更换！！！
    TURING.字库_加载六十四进制识别字库(require('Config.TextRecognition1').文字识别库())     -- [VIP]
    local 识别结果 = TURING.识别(65)
    sleep(300)
    print('识别结果:'..识别结果)
    if 识别结果 ~= nil and 识别结果 ~= "" then    -- 注意：空值判断
        -- 使用模糊匹配，处理OCR识别错误
        local is_match, matched_text = Tools.fuzzy_match("一键购买按钮", 识别结果)
        if is_match then
            tap(323,679)
            print("点击一键购买按钮，匹配到:", matched_text)
            sleep(1000)
        end
    end
end

function CheckAndClickOneKeyBuyConfirm()
    TURING.来源_获取屏幕像素(0,0,1280,719)    -- 需要修改的地方！
    -- TURING.来源_获取屏幕像素(0,0,100,100)    -- 仅备用！
    TURING.滤镜_彩色_二值化("0-138")
    TURING.切割_范围投影切割(2,4)
    --TURING.字库_加载识别字库(getSdPath() .. "/夜鸭字库.lib")    -- 识别字库路径可自行更换！！！
    TURING.字库_加载六十四进制识别字库(require('Config.TextRecognition1').文字识别库())     -- [VIP]
    local 识别结果 = TURING.识别(65)
    sleep(300)
    print('识别结果:'..识别结果)
    if 识别结果 ~= nil and 识别结果 ~= "" then    -- 注意：空值判断
        -- 使用模糊匹配，处理OCR识别错误
        local is_match, matched_text = Tools.fuzzy_match("一件购买药品界面确认购买按钮", 识别结果)
        if is_match then
            tap(735,631)
            print("点击一件购买药品界面确认购买按钮，匹配到:", matched_text)
            sleep(2000)
            tap(901,553)        
        end
    end
end

function CheckNeedCleanBag() --检查是否需要清理背包
    --点击清理背包按钮
end



function CheckNeedOpenAutoFight() --检查是否需要开启自动战斗
    --点击自动战斗按钮
end

function CheckAndClickFangDaJing() --检查如果有放大镜则点击一次
    if CheckIsNPC() == true then  --检测NPC界面是否打开了
        tap(304,72) --点击放大镜以显示地图
        return true
    end
    return false
end

function FuHao()
    --自动检测是否需要复活
    CheckNeedRevive()
    CheckHPNumber()
    CheckAndClickFangDaJing()--点击放大镜以显示地图
end

function CheckHPNumber() --检测血瓶百位的数量
    local textRecognition = require('Config.TextRecognition1')
    
    -- 使用通用数字识别方法
    local num = Tools.recognize_number_in_range(
        319, 675, 354, 687,  -- 识别区域坐标
        "0-166",              -- 滤镜范围
        2, 2,                 -- 切割参数
        textRecognition.文字识别库,  -- 字库函数        
        75                    -- 识别置信度
    )
    
    -- 如果识别到有效数字，执行购买逻辑
    if num then
        print('血瓶数量为', num, '，自动购买')
        AutoBuyHp()
        if config.gameState == config.State.GOFIGHT then
           print('[DEBUG] 血瓶数量不足，已购买，退出CheckHPNumber循环')
           return  -- 退出函数，结束循环
        end
    else
        print('血瓶数量识别失败或超出预期范围')
    end
end
 function CheckAndClickRiChengConfirm() --
    TURING.来源_获取屏幕像素(552,425,728,477)    -- 需要修改的地方！
    -- TURING.来源_获取屏幕像素(0,0,100,100)    -- 仅备用！
    TURING.滤镜_彩色_二值化("0-126")
    TURING.切割_范围投影切割(2,3)
    --TURING.字库_加载识别字库(getSdPath() .. "/夜鸭字库.lib")    -- 识别字库路径可自行更换！！！
    TURING.字库_加载六十四进制识别字库(require('Config.TextRecognition1').文字识别库())     -- [VIP]
    local 识别结果 = TURING.识别(85)
    sleep(300)
    print('识别结果:'..识别结果)
    if 识别结果 ~= nil and 识别结果 ~= "" then    -- 注意：空值判断
        if 识别结果 == "日程关闭确认按钮" then
            tap(641, 451)
            sleep(1000)
        end
    end
 end
 
function AutoBuyHp()
    local isMainCity = false
    while isMainCity == false do
        UseMainCityScroll()
        isMainCity = CheckIsMainCity()
        sleep(300)
        if isMainCity == false then
            isMainCity  = CheckIsNPC()
        end
        print("是否回到了主城:", isMainCity)
   end
   
    CheckAndClickRiChengConfirm()
    --自动检测是否需要买药
    CheckAndClickNPC(config.NpcName.杂货, function()     
        CheckAndClickOneKeyBuy()--点击一键购买设置按钮
        CheckAndClickOneKeyBuyConfirm()--点击一键购买确认按钮
        CheckIsExitNPCPanel(true)-- 退出NPC界面 
        config.gameState = config.State.GOFIGHT
     end)--点击杂货铺寻路按钮
end

function UseMainCityScroll()
    tap(884,661) --点击回城卷轴--默认回城卷轴放到最后一个快捷栏
    CheckAndClickRiChengConfirm()
end

function CheckIsMainCity()
    return Tools.turing_recognize_and_act(72,70,176,87, "B8CCD6-303030|65747B-101010|879CA6-202020", 1, 4, text_recognition_lib, "主城", function()
      
    end)
end

function ExitAutoHuntPanel()--检测并退出自动狩猎界面
    TURING.来源_获取屏幕像素(1122,580,1160,613)    -- 需要修改的地方！
    -- TURING.来源_获取屏幕像素(0,0,100,100)    -- 仅备用！
    TURING.滤镜_彩色_二值化("0-114")
    TURING.切割_范围投影切割(5,5)
    --TURING.字库_加载识别字库(getSdPath() .. "/夜鸭字库.lib")    -- 识别字库路径可自行更换！！！
end

function CheckIsLoading()
    return Tools.turing_recognize_and_act(606,670,674,691, "89C8DB-303030|64919E-303030|445B63", 2, 8, text_recognition_lib, "正在读取中", function()
        return true
    end)
end

-- 已将主流程调度相关函数迁移至 myMain.lua
print("mybot.lua 文件已加载")




